﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using SegIdenPC.Entidad;
using SegIdenPC.Herramientas;
using log4net;
using GS1.Utilitario;
using System.Drawing.Imaging;
using System.Configuration;

namespace SegIdenPC.Formularios
{
    public partial class frmMantSolicitudBultoProducto : Form
    {
        #region --- Variables y Propiedades ---
        private static readonly ILog log = LogManager.GetLogger(typeof(frmMantPrestamo));

        private const string TITULO = "Mantenimiento de Solicitudes de Bultos";
        private const string FORMATO_TOTAL_ENCONTRADOS = "Total productos encontrados: {0}";

        public enum OperacionMantenimiento
        {
            Nuevo,
            Editar
        }

        private OperacionMantenimiento tipoOperacion = OperacionMantenimiento.Nuevo;

        private enum Opcion
        {
            Abrir = 0,
            Nuevo = 1,
            Editar = 2,
            Grabar = 3,
            Atendido = 4,
            Cancelar = 5,
            Generar = 6
        }

        private Solicitud solicitudActual = null;
        private ListaTienda listaTienda = null;
        private ListaSolicitud listaSolicitud = null;
        private const string FORMATO_PRODUCTO_DESCRIPCION_DETALLADA = "{0} - {1} - {2} - {3}";
        private Tienda tiendaOrigenActual = null;
        private Tienda tiendaDestinoActual = null;
        //private Bulto bulto = null;
        private Producto producto = null;
        #endregion

        #region --- Constructor ---
        public frmMantSolicitudBultoProducto()
        {
            InitializeComponent();
        }

        private void frmMantSolicitudBultoProducto_Load(object sender, EventArgs e)
        {
            cargarFormulario();
        }

        private void tabControl_Selecting(object sender, TabControlCancelEventArgs e)
        {
            if (!e.TabPage.Enabled) { e.Cancel = true; }
        }
        private void btnBuscar_Click(object sender, EventArgs e)
        {
            buscarSolicitud();
        }

        private void tbtnAbrir_Click(object sender, EventArgs e)
        {
            abrir();
        }
        private void dgvListadoBultos_CellContentClick(object sender, DataGridViewCellEventArgs e)
        {
            abrirBulto();
        }

        private void dgvListadoBultosSeleccionados_CellContentClick(object sender, DataGridViewCellEventArgs e)
        {
            abrirBultoSeleccion();
        }

        private void tbtnCancelar_Click(object sender, EventArgs e)
        {
            cancelar();
        }
        private void tbtnSalir_Click(object sender, EventArgs e)
        {
            salir();
        }

        private void tbtnGrabar_Click(object sender, EventArgs e)
        {
            grabar();
        }

        private void tbtnEditar_Click(object sender, EventArgs e)
        {
            editar();
        }
        private void btnAgregar_Click(object sender, EventArgs e)
        {
            agregarBulto();
        }
        private void btnEliminar_Click(object sender, EventArgs e)
        {
            quitarBulto();
        }
        private void tbtnNuevo_Click(object sender, EventArgs e)
        {
            nuevo();
        }

        private void btnBuscarTiendaO_Click(object sender, EventArgs e)
        {
            elegirTiendaOrigen();
        }

        private void btnBuscarTiendaD_Click(object sender, EventArgs e)
        {
            elegirTiendaDestino();
        }

        private void btnBuscarProducto_Click(object sender, EventArgs e)
        {
            elegirProducto();
        }

        private void btnBuscarTiendaOE_Click(object sender, EventArgs e)
        {
            elegirTiendaOrigen();
        }

        private void btnBuscarTiendaDE_Click(object sender, EventArgs e)
        {
            elegirTiendaDestino();
        }

        private void btnBuscarProductoE_Click(object sender, EventArgs e)
        {
            elegirProducto();
        }

        private void btnAceptarE_Click(object sender, EventArgs e)
        {
            agregarBulto();
        }

        private void btnEliminarE_Click(object sender, EventArgs e)
        {
            quitarBulto();
        }

        //:
        #endregion

        #region --- Metodos Propios ---
        private void cargarFormulario()
        {
            ListaGeneral listaEstado = null;

            try
            {
                Cursor.Current = Cursors.WaitCursor;

                // Activaciones de botones por rol
                controlBotonesPorRol();

                // Instanciando y creando listado de estado
                listaEstado = new ListaGeneral();
                listaEstado.Add(new General { codigo = Constantes.ESTADO_DOCUMENTO_PENDIENTE, descripcion = Constantes.ESTADO_DOCUMENTO_DESCRIPCION_PENDIENTE });
                listaEstado.Add(new General { codigo = Constantes.ESTADO_DOCUMENTO_AUTORIZADO, descripcion = Constantes.ESTADO_DOCUMENTO_DESCRIPCION_AUTORIZADO });
                listaEstado.Add(new General { codigo = Constantes.ESTADO_DOCUMENTO_RECEPCIONADO, descripcion = Constantes.ESTADO_DOCUMENTO_DESCRIPCION_RECEPCIONADO });
                listaEstado.Add(new General { codigo = Constantes.ESTADO_DOCUMENTO_PARCIAL, descripcion = Constantes.ESTADO_DOCUMENTO_DESCRIPCION_PARCIAL });
                listaEstado.Add(new General { codigo = Constantes.ESTADO_DOCUMENTO_DESPACHADO, descripcion = Constantes.ESTADO_DOCUMENTO_DESCRIPCION_DESPACHADO });

                //Instanciando y creando listado de país
                listaTienda = new ListaTienda();

                // Desactivando el grupo de campo de informacion
                this.tabPagDatos.Enabled = false;
                // Estableciendo Ficha 0 como seleccion incial
                this.tabControl.SelectedIndex = 0;
                // Capturando evento selecting en el control Tab
                this.tabControl.Selecting += new TabControlCancelEventHandler(tabControl_Selecting);

                // Estableciendo a 0 el texto del total de registros encontrados.
                this.lblTotalRegistros.Text = string.Format(FORMATO_TOTAL_ENCONTRADOS, 0);

                // Desactivando el boton abrir.
                this.tbtnAbrir.Enabled = false;

                // Estableciendo datos del combo Estado
                this.cboEstado.DataSource = listaEstado;
                this.cboEstado.ValueMember = Constantes.GENERAL_CODIGO;
                this.cboEstado.DisplayMember = Constantes.GENERAL_DESCRIPCION;
                this.cboEstado.SelectedIndex = 0;

                //Estableciendo lista de tiendas
                cargarTiendas();

                // Estableciendo tienda de destino
                this.tiendaDestinoActual = ParametrosAplicacion.TIENDA_ACTUAL;
                this.txtTiendaDCodigo.Text = this.tiendaDestinoActual.codigo;
                this.txtTiendaDDescripcion.Text = this.tiendaDestinoActual.nombre;

                this.dtpFechaVencimiento.Value = DateTime.Now;

                // Estableciendo focus

                this.cboCriterio.Focus();

            }
            catch (Exception ex)
            {
                log.Error(ex.Message, ex);
                Libreria.MensajeError(ex, TITULO);
            }
            finally
            {
                Cursor.Current = Cursors.Default;
            }

        }

        private void controlBotonesPorRol()
        {
            if (ParametrosAplicacion.ROL_ADMINISTRADOR.codigo.Equals(ParametrosAplicacion.USUARIO_ACTUAL.rol.codigo)) { return; }

            this.tbtnNuevo.Visible = false;
            this.tbtnEditar.Visible = false;
            //this.tbtnEliminar.Visible = false;
            this.tbtnGrabar.Visible = false;
        }
        private void finalizarFormulario()
        {
            this.tabControl.Selecting -= new TabControlCancelEventHandler(tabControl_Selecting);
        }
        private void cargarTiendas()
        {
            Operacion operacion = null;
            string contenidoXML = string.Empty;

            // Estableciendo operacion a ser enviada al Servicio REST
            operacion = new Operacion();
            operacion.numero = Constantes.OPERACION_LISTAR_TIENDAS;

            operacion.tienda = new Tienda();
            operacion.tienda.nombre = "%";
            operacion.tienda.estado = Constantes.ESTADO_CODIGO_ACTIVO;

            // Instanciando y ejecutando llamada al ServicioREST
            ConexionREST conexionREST = new ConexionREST();
            contenidoXML = conexionREST.ejecutarOperacion(operacion);

            // Obteniendo Objeto de Error
            OperacionError operacionError = contenidoXML.DeserializarTo<OperacionError>();

            // Validar si hay error
            if (operacionError != null)
            {
                Libreria.ShowMessageboxError(operacionError.descripcion);
                return;
            }

            // Obteniendo Objeto de ListaTienda
            this.listaTienda = contenidoXML.DeserializarTo<ListaTienda>();

            // Estableciendo listado de Tienda
            this.cboCriterio.DataSource = this.listaTienda.lista;
            this.cboCriterio.ValueMember = "codigo";
            this.cboCriterio.DisplayMember = "nombre";
            this.cboCriterio.SelectedIndex = 0;

            // Creando listado para registro de Tienda
            ListaTienda listaTiendaNueva = new ListaTienda();

            foreach (Tienda tienda in this.listaTienda.lista)
            {
                listaTiendaNueva.add(new Tienda { codigo = tienda.codigo, nombre = tienda.nombre });
            }

        }

        private void elegirTiendaOrigen()
        {
            using (frmMantTienda frmMantTienda = new frmMantTienda())
            {
                frmMantTienda.formularioBusqueda = true;
                if (frmMantTienda.ShowDialog() == DialogResult.Cancel) { return; }

                this.tiendaOrigenActual = frmMantTienda.tiendaActual;
                this.txtTiendaOCodigo.Text = this.tiendaOrigenActual.codigo;
                this.txtTiendaODescripcion.Text = this.tiendaOrigenActual.nombre;
            }
        }

        private void elegirTiendaDestino()
        {
            using (frmMantTienda frmMantTienda = new frmMantTienda())
            {
                frmMantTienda.formularioBusqueda = true;
                if (frmMantTienda.ShowDialog() == DialogResult.Cancel) { return; }

                this.tiendaDestinoActual = frmMantTienda.tiendaActual;
                this.txtTiendaDCodigo.Text = this.tiendaDestinoActual.codigo;
                this.txtTiendaDDescripcion.Text = this.tiendaDestinoActual.nombre;
            }
        }
        private void nuevo()
        {
            // Estableciendo estado de TagPage de Listado y datos
            this.tabPagListado.Enabled = false;
            this.tabPagDatos.Enabled = true;

            // Mostrar la segunda pagina del TabControl
            this.tabControl.SelectedIndex = 1;

            this.grpDatos.Enabled = true;

            // Estableciendo los estados de los botones
            cambiarEstadoBotones(Opcion.Nuevo);

            this.tipoOperacion = OperacionMantenimiento.Nuevo;

            // Estableciendo focus control txtDescripcion
            this.btnBuscarTiendaO.Focus();

            // Limpiando los datos del formulario
            this.txtCodigo.Text = string.Empty;
            this.txtTiendaOCodigo.Text = string.Empty;
            this.txtTiendaODescripcion.Text = string.Empty;
            this.txtTiendaDCodigo.Text = string.Empty;
            this.txtTiendaDDescripcion.Text = string.Empty;

            this.dtpFechaVencimiento.Value = DateTime.Now;
            this.txtObservacion.Text = string.Empty;

            this.txtProductoCodigo.Text = string.Empty;
            this.txtProductoDescripcion.Text = string.Empty;

            if (solicitudActual != null)
            {
                // Limpiando grilla de detalle de Items
                ListPersonalizada<Bulto> listaBultos = (ListPersonalizada<Bulto>)this.dgvListadoBultos.DataSource;
                ListPersonalizada<LineaSolicitudBulto> listaLineaSolicitudBultos = (ListPersonalizada<LineaSolicitudBulto>)this.dgvListadoBultosSeleccionados.DataSource;

                if (listaBultos != null)
                {
                    listaBultos.Clear();

                    this.dgvListadoBultos.DataSource = null;
                    this.dgvListadoBultos.DataSource = listaBultos;
                }

                if (listaLineaSolicitudBultos != null)
                {
                    listaLineaSolicitudBultos.Clear();

                    this.dgvListadoBultosSeleccionados.DataSource = null;
                    this.dgvListadoBultosSeleccionados.DataSource = listaLineaSolicitudBultos;
                }
            }
            else
            {
                // Limpiando grilla de detalle de Items
                ListPersonalizada<Bulto> listaBultos = (ListPersonalizada<Bulto>)this.dgvListadoBultos.DataSource;
                ListPersonalizada<Bulto> listaBultosSeleccion = (ListPersonalizada<Bulto>)this.dgvListadoBultosSeleccionados.DataSource;

                if (listaBultos != null)
                {
                    listaBultos.Clear();

                    this.dgvListadoBultos.DataSource = null;
                    this.dgvListadoBultos.DataSource = listaBultos;
                }

                if (listaBultosSeleccion != null)
                {
                    listaBultosSeleccion.Clear();

                    this.dgvListadoBultosSeleccionados.DataSource = null;
                    this.dgvListadoBultosSeleccionados.DataSource = listaBultosSeleccion;
                }
            
            }
  
            this.btnBuscarTiendaO.Enabled = true;
            this.btnBuscarTiendaD.Enabled = true;
            this.dtpFechaVencimiento.Enabled = true;
            this.txtObservacion.Enabled = true;
            this.btnBuscarProducto.Enabled = true;
            this.cboEstado.Enabled = true;
        }

        private void grabar()
        {
            Operacion operacion = null;
            string contenidoXML = string.Empty;

            try
            {
                if (validarEntrada()) { return; }

                // Estableciendo operacion a ser enviada al Servicio REST
                operacion = new Operacion();

                operacion.solicitud = new Solicitud();

                // Estableciendo proveedor del OC
                operacion.solicitud.tiendaOrigen = new Tienda();
                operacion.solicitud.tiendaOrigen.codigo = this.tiendaOrigenActual.codigo;
                operacion.solicitud.tiendaOrigen.nombre = this.tiendaOrigenActual.nombre;

                // Estableciendo proveedor del OC
                operacion.solicitud.tiendaDestino = new Tienda();
                operacion.solicitud.tiendaDestino.codigo = this.tiendaDestinoActual.codigo;
                operacion.solicitud.tiendaDestino.nombre = this.tiendaDestinoActual.nombre;

                // Estableciendo el tipo de solicitud
                operacion.solicitud.tipo = Constantes.CODIGO_TIPO_SOLICITUD_BULTO;

                // Estableciendo usuario de registro
                operacion.solicitud.usuario = new Usuario();
                operacion.solicitud.usuario.codUsuario = ParametrosAplicacion.USUARIO_ACTUAL.codUsuario;

                operacion.solicitud.fechaVencimiento = this.dtpFechaVencimiento.Value.ToString(Constantes.FORMATO_FECHAHORA);
                operacion.solicitud.observacion = this.txtObservacion.Text;
                operacion.solicitud.estado = this.cboEstado.SelectedValue.ToString();
                
                operacion.solicitud.usuarioAprovacion = new Usuario();
                operacion.solicitud.usuarioAprovacion = ParametrosAplicacion.USUARIO_ACTUAL;

                operacion.solicitud.fechaRegistro = DateTime.Now.ToString(Constantes.FORMATO_FECHAHORA);


                if (tipoOperacion == OperacionMantenimiento.Nuevo)
                {
                    // Capturando listado de Bulto agregados
                    ListPersonalizada<Bulto> listaBultoAgregados = (ListPersonalizada<Bulto>)this.dgvListadoBultosSeleccionados.DataSource;

                    ListaLineaSolicitudBulto listaLineaSolicitudBulto = new ListaLineaSolicitudBulto();
                    LineaSolicitudBulto lineaSolicitudBulto = null;

                    foreach (Bulto bulto in listaBultoAgregados)
                    {
                        lineaSolicitudBulto = new LineaSolicitudBulto();
                        lineaSolicitudBulto.bulto = new Bulto { codBulto = bulto.codBulto, SSCC = bulto.SSCC, estado = bulto.estado };

                        listaLineaSolicitudBulto.add(lineaSolicitudBulto);
                    }

                    // Estableciendo listado de bultos
                    operacion.solicitud.listaLineaSolicitudBulto = listaLineaSolicitudBulto;
                    operacion.solicitud.codSolicitud = Constantes.VALOR_CERO;
                    operacion.numero = Constantes.OPERACION_REGISTRAR_SOLICITUD;
                }
                else if (tipoOperacion == OperacionMantenimiento.Editar)
                {
                    // Capturando listado de Bulto agregados

                    ListPersonalizada<LineaSolicitudBulto> listaBultoAgregados = (ListPersonalizada<LineaSolicitudBulto>)this.dgvListadoBultosSeleccionados.DataSource;

                    ListaLineaSolicitudBulto listaLineaSolicitudBulto = new ListaLineaSolicitudBulto();
                    LineaSolicitudBulto lineaSolicitudBulto = null;

                    foreach (LineaSolicitudBulto bulto in listaBultoAgregados)
                    {
                        lineaSolicitudBulto = new LineaSolicitudBulto();
                        lineaSolicitudBulto.bulto = new Bulto { codBulto = bulto.bulto.codBulto, SSCC = bulto.bulto.SSCC, estado = "S" };

                        listaLineaSolicitudBulto.add(lineaSolicitudBulto);
                    }

                    operacion.solicitud.listaLineaSolicitudBulto = listaLineaSolicitudBulto;
                    operacion.solicitud.codSolicitud = solicitudActual.codSolicitud;
                    if (cboEstado.Text.Equals(Constantes.ESTADO_DOCUMENTO_DESCRIPCION_AUTORIZADO))
                    {
                        operacion.solicitud.fechaAprovacion = DateTime.Now.ToString(Constantes.FORMATO_FECHAHORA);
                    }

                    //operacion.solicitud.fechaAprovacion = DateTime.Now.ToString(Constantes.FORMATO_FECHAHORA);
                    operacion.numero = Constantes.OPERACION_MODIFICAR_SOLICITUD_BULTO;
                }

                // Instanciando y ejecutando llamada al ServicioREST
                ConexionREST conexionREST = new ConexionREST();
                contenidoXML = conexionREST.ejecutarOperacion(operacion);

                // Obteniendo Objeto de Error
                OperacionError operacionError = contenidoXML.DeserializarTo<OperacionError>();

                // Validar si hay error
                if (operacionError != null)
                {
                    Libreria.ShowMessageboxError(operacionError.descripcion);
                    return;
                }

                OperacionResultado operacionResultado = contenidoXML.DeserializarTo<OperacionResultado>();

                if ((operacionResultado != null) &&
                    (operacionResultado.esOK.Equals(Constantes.SI)))
                {
                    this.txtCodigo.Text = operacionResultado.codigoGenerado;
                    Libreria.ShowMessageboxInfo("Registro guardado correctamente", TITULO);
                }
                else
                {
                    Libreria.ShowMessageboxError("No se guardo los datos", TITULO);
                    return;
                }

                // Estableciendo los estados de los botones
                this.grpDatos.Enabled = false;
                // Estableciendo estado de TagPage de Listado y datos
                this.tabPagListado.Enabled = true;
                this.tabPagDatos.Enabled = false;
                // Mostrar la primera pagina del TabControl
                this.tabControl.SelectedIndex = 0;

                buscarSolicitud();

                // Estableciendo los estados de los botones
                cambiarEstadoBotones(Opcion.Generar);

            }
            catch (Exception ex)
            {
                log.Error(ex.Message, ex);
                Libreria.MensajeError(ex, TITULO);
            }
        }


        private bool validarEntrada()
        {
            bool resultado = false;

            this.txtObservacion.Text = this.txtObservacion.Text.Trim();
            this.txtTiendaOCodigo.Text = this.txtTiendaOCodigo.Text.Trim();
            this.txtTiendaDCodigo.Text = this.txtTiendaDCodigo.Text.Trim();

            if (this.txtTiendaOCodigo.Text.Equals(string.Empty))
            {
                Libreria.CampoNecesario(this.txtTiendaOCodigo, "Debe elegir una Tienda de Orígen", TITULO);
                return true;
            }

            if (this.txtTiendaDCodigo.Text.Equals(string.Empty))
            {
                Libreria.CampoNecesario(this.txtTiendaDCodigo, "Debe elegir una Tienda de Destino", TITULO);
                return true;
            }

            if (this.txtTiendaOCodigo.Text.Equals(this.txtTiendaDCodigo.Text))
            {
                Libreria.CampoNecesario(this.txtTiendaOCodigo, "La Tienda de Origen debe ser diferente a la Tienda Destino", TITULO);
                return true;
            }

            if (this.txtObservacion.Text.Equals(string.Empty))
            {
                Libreria.CampoNecesario(this.txtObservacion, "Debe ingresar el campo Observación", TITULO);
                return true;
            }

            if (tipoOperacion == OperacionMantenimiento.Nuevo)
            {
                ListPersonalizada<Bulto> listaBulto = (ListPersonalizada<Bulto>)this.dgvListadoBultosSeleccionados.DataSource;

                if ((listaBulto == null) || (listaBulto != null && listaBulto.Count == 0))
                {
                    Libreria.CampoNecesario(this.dgvListadoBultosSeleccionados, "Debe ingresar por lo menos un Bulto a la Solicitud", TITULO);
                    return true;
                }
            }
            else if (tipoOperacion == OperacionMantenimiento.Editar)
            {
                ListPersonalizada<LineaSolicitudBulto> listaLineaSolicitudBulto = (ListPersonalizada<LineaSolicitudBulto>)this.dgvListadoBultosSeleccionados.DataSource;

                if ((listaLineaSolicitudBulto == null) || (listaLineaSolicitudBulto != null && listaLineaSolicitudBulto.Count == 0))
                {
                    Libreria.CampoNecesario(this.dgvListadoBultosSeleccionados, "Debe ingresar por lo menos un Bulto a la Solicitud", TITULO);
                    return true;
                }
            }

            return resultado;
        }

        private void buscarSolicitud()
        {
            Operacion operacion = null;
            string contenidoXML = string.Empty;

            // Estableciendo operacion a ser enviada al Servicio REST
            operacion = new Operacion();
            operacion.numero = Constantes.OPERACION_LISTAR_SOLICITUDES;

            operacion.solicitud = new Solicitud();
            operacion.solicitud.tiendaOrigen = new Tienda();
            operacion.solicitud.tiendaOrigen.codigo = this.cboCriterio.SelectedValue.ToString();
            //operacion.solicitud.estado = Constantes.ESTADO_DOCUMENTO_PENDIENTE;
            operacion.solicitud.tipo = Constantes.CODIGO_TIPO_SOLICITUD_BULTO;

            // Instanciando y ejecutando llamada al ServicioREST
            ConexionREST conexionREST = new ConexionREST();
            contenidoXML = conexionREST.ejecutarOperacion(operacion);

            // Obteniendo Objeto de Error
            OperacionError operacionError = contenidoXML.DeserializarTo<OperacionError>();

            // Validar si hay error
            if (operacionError != null)
            {
                Libreria.ShowMessageboxError(operacionError.descripcion);
                return;
            }

            // Obteniendo Objeto de la lista de solicitudes pendientes de autorizacion
            this.listaSolicitud = contenidoXML.DeserializarTo<ListaSolicitud>();

            // Mostrar el total de registros encontrados
            this.lblTotalRegistros.Text = string.Format(FORMATO_TOTAL_ENCONTRADOS, listaSolicitud.lista.Count);

            // Se establece propiedad para evitar que genere nuevas columnas que no estan mapeadas en la grilla
            this.dgvListadoSolicitudes.AutoGenerateColumns = false;

            // Se establece la fuente de datos de la grilla
            this.dgvListadoSolicitudes.DataSource = listaSolicitud.lista;

            // Activando o desactivando boton Abrir
            this.tbtnAbrir.Enabled = listaSolicitud.lista.Count > 0;

            // Colorear grilla deacuerdo a criterios
            pintarGrilla(dgvListadoSolicitudes);

        }

        private void pintarGrilla(DataGridView grilla)
        {
            ListPersonalizada<Solicitud> listaSolicitud = null;
            listaSolicitud = (ListPersonalizada<Solicitud>)grilla.DataSource;

            if (listaSolicitud != null)
            {
                for (int i = 0; i < listaSolicitud.Count; i++)
                {
                    Solicitud solicitud = listaSolicitud[i];

                   grilla.Rows[i].Cells[0].Value = solicitud.codSolicitud;
                   grilla.Rows[i].Cells[1].Value = solicitud.tiendaDestino.nombre;
                   grilla.Rows[i].Cells[2].Value = Convert.ToDateTime(solicitud.fechaVencimiento).ToString(Constantes.FORMATO_FECHA);
                   switch (solicitud.estado)
                    {

                        case Constantes.ESTADO_DOCUMENTO_DESPACHADO:
                            {
                                grilla.Rows[i].Cells[3].Value = Constantes.ESTADO_DOCUMENTO_DESCRIPCION_DESPACHADO;
                                break;
                            }
                        case Constantes.ESTADO_DOCUMENTO_DEVUELTO:
                            {
                                grilla.Rows[i].Cells[3].Value = Constantes.ESTADO_DOCUMENTO_DESCRIPCION_DEVUELTO;
                                break;
                            }
                        case Constantes.ESTADO_DOCUMENTO_IMPRESO:
                            {
                                grilla.Rows[i].Cells[3].Value = Constantes.ESTADO_DOCUMENTO_DESCRIPCION_IMPRESO;
                                break;
                            }
                        case Constantes.ESTADO_DOCUMENTO_PARCIAL:
                            {
                                grilla.Rows[i].Cells[3].Value = Constantes.ESTADO_DOCUMENTO_DESCRIPCION_PARCIAL;
                                break;
                            }
                        case Constantes.ESTADO_DOCUMENTO_PENDIENTE:
                            {
                                grilla.Rows[i].Cells[3].Value = Constantes.ESTADO_DOCUMENTO_DESCRIPCION_PENDIENTE;
                                break;
                            }
                        case Constantes.ESTADO_DOCUMENTO_RECEPCIONADO:
                            {
                                grilla.Rows[i].Cells[3].Value = Constantes.ESTADO_DOCUMENTO_DESCRIPCION_RECEPCIONADO;
                                break;
                            }
                        case Constantes.ESTADO_DOCUMENTO_AUTORIZADO:
                            {
                                grilla.Rows[i].Cells[3].Value = Constantes.ESTADO_DOCUMENTO_DESCRIPCION_AUTORIZADO;
                                break;
                            }
                    }


                   if (solicitud.estado.Equals(Constantes.ESTADO_DOCUMENTO_DESCRIPCION_DESPACHADO) ||
                solicitud.estado.Equals(Constantes.ESTADO_DOCUMENTO_DESCRIPCION_RECEPCIONADO) ||
                solicitud.estado.Equals(Constantes.ESTADO_DOCUMENTO_DESCRIPCION_PARCIAL) ||
                solicitud.estado.Equals(Constantes.ESTADO_DOCUMENTO_DESCRIPCION_IMPRESO) ||
                solicitud.estado.Equals(Constantes.ESTADO_DOCUMENTO_DESCRIPCION_DEVUELTO))
                {
                    this.dgvListadoSolicitudes.Rows[i].DefaultCellStyle.BackColor = Color.FromArgb(255, 128, 128);
                }
                       

                }
            }
        }

        private void abrir()
        {
            // Estableciendo estado de TagPage de Listado y datos
            this.tabPagListado.Enabled = false;
            this.tabPagDatos.Enabled = true;

            // Mostrar la segunda pagina del TabControl
            this.tabControl.SelectedIndex = 1;

            // Estableciendo los estados de los botones
            cambiarEstadoBotones(Opcion.Abrir);

            // Valida si seleccione algun equipos
            if (this.dgvListadoSolicitudes.CurrentRow != null && this.dgvListadoSolicitudes.CurrentRow.Index > -1)
            {
                ListPersonalizada<Solicitud> listaSolicitud = (ListPersonalizada<Solicitud>)this.dgvListadoSolicitudes.DataSource;
                this.solicitudActual = obtenerSolicitud(listaSolicitud[this.dgvListadoSolicitudes.CurrentRow.Index]);

                this.txtCodigo.Text = solicitudActual.codSolicitud;

                this.tiendaOrigenActual = solicitudActual.tiendaOrigen;
                this.txtTiendaOCodigo.Text = solicitudActual.tiendaOrigen.codigo.ToString();
                this.txtTiendaODescripcion.Text = solicitudActual.tiendaOrigen.nombre;

                this.tiendaDestinoActual = solicitudActual.tiendaDestino;
                this.txtTiendaDCodigo.Text = solicitudActual.tiendaDestino.codigo.ToString();
                this.txtTiendaDDescripcion.Text = solicitudActual.tiendaDestino.nombre;

                this.dtpFechaVencimiento.Text = Convert.ToDateTime(solicitudActual.fechaVencimiento).ToString(Constantes.FORMATO_FECHA);
                this.txtObservacion.Text = solicitudActual.observacion;

                // Se establece propiedad para evitar que genere nuevas columnas que no estan mapeadas en la grilla
                this.dgvListadoBultos.AutoGenerateColumns = false;
                this.dgvListadoBultosSeleccionados.AutoGenerateColumns = false;

                // Se establece fuente de datos
                this.dgvListadoBultosSeleccionados.DataSource = solicitudActual.listaLineaSolicitudBulto == null ?
                                                        new ListPersonalizada<LineaSolicitudBulto>() :
                                                        solicitudActual.listaLineaSolicitudBulto.lista;

                formatearGrilla(this.dgvListadoBultosSeleccionados);


                switch (solicitudActual.estado)
                {
                    case Constantes.ESTADO_DOCUMENTO_PENDIENTE:
                        this.cboEstado.Text = Constantes.ESTADO_DOCUMENTO_DESCRIPCION_PENDIENTE;
                        break;
                    case Constantes.ESTADO_DOCUMENTO_AUTORIZADO:
                        this.cboEstado.Text = Constantes.ESTADO_DOCUMENTO_DESCRIPCION_AUTORIZADO;
                        break;
                    case Constantes.ESTADO_DOCUMENTO_DESPACHADO:
                        this.cboEstado.Text = Constantes.ESTADO_DOCUMENTO_DESCRIPCION_DESPACHADO;
                        //debe deshabilitar todos los botones y tambien los de consulta
                        cambiarEstadoBotones(Opcion.Atendido);
                        break;
                    case Constantes.ESTADO_DOCUMENTO_PARCIAL:
                        this.cboEstado.Text = Constantes.ESTADO_DOCUMENTO_DESCRIPCION_PARCIAL;
                        //debe deshabilitar todos los botones y tambien los de consulta
                        cambiarEstadoBotones(Opcion.Atendido);
                        break;
                    case Constantes.ESTADO_DOCUMENTO_IMPRESO:
                        this.cboEstado.Text = Constantes.ESTADO_DOCUMENTO_DESCRIPCION_IMPRESO;
                        //debe deshabilitar todos los botones y tambien los de consulta
                        cambiarEstadoBotones(Opcion.Atendido);
                        break;
                    case Constantes.ESTADO_DOCUMENTO_DEVUELTO:
                        this.cboEstado.Text = Constantes.ESTADO_DOCUMENTO_DESCRIPCION_DEVUELTO;
                        //debe deshabilitar todos los botones y tambien los de consulta
                        cambiarEstadoBotones(Opcion.Atendido);
                        break;
                    case Constantes.ESTADO_DOCUMENTO_RECEPCIONADO:
                        this.cboEstado.Text = Constantes.ESTADO_DOCUMENTO_DESCRIPCION_RECEPCIONADO;
                        //debe deshabilitar todos los botones y tambien los de consulta
                        cambiarEstadoBotones(Opcion.Atendido);
                        break;
                }
                this.cboEstado.Enabled = false;
                this.btnBuscarTiendaO.Enabled = false;
                this.btnBuscarTiendaD.Enabled = false;
                this.dtpFechaVencimiento.Enabled = false;
                this.txtObservacion.Enabled = false;
                this.btnAgregar.Enabled = false;
                this.btnEliminar.Enabled = false;
                this.btnBuscarProducto.Enabled = false;

                if (solicitudActual.listaLineaSolicitudBulto.lista.Count == 0)
                {
                    Libreria.ShowMessageboxInfo("Esta solicitud es de productos, para ver el contenido vaya al menú solicitud producto", TITULO);

                    //return;
                    // Estableciendo estado de TagPage de Listado y datos
                    this.tabPagListado.Enabled = true; this.tabPagDatos.Enabled = false;

                    // Mostrar la primera pagina del TabControl
                    this.tabControl.SelectedIndex = 0;

                    // Deshabilitando el grupoBox de datos
                    this.grpDatos.Enabled = false;

                    // Estableciendo los estados de los botones
                    cambiarEstadoBotones(Opcion.Cancelar);

                    // Estableciendo focus
                    this.btnBuscar.Focus();

                }
               
            }
        }
        private void formatearGrilla(DataGridView grilla)
        {
            ListPersonalizada<LineaSolicitudBulto> listaLineaSolicitudBultos = null;
            listaLineaSolicitudBultos = (ListPersonalizada<LineaSolicitudBulto>)grilla.DataSource;

            if (listaLineaSolicitudBultos != null)
            {
                for (int i = 0; i < listaLineaSolicitudBultos.Count; i++)
                {
                    var lineaSolicitudBultos = listaLineaSolicitudBultos[i];
                    grilla.Rows[i].Cells[0].Value = lineaSolicitudBultos.bulto.codBulto;
                    grilla.Rows[i].Cells[1].Value = lineaSolicitudBultos.bulto.SSCC;
                }
            }
        }

        private void formatearGrillaNuevo(DataGridView grilla)
        {
            ListPersonalizada<Bulto> listaBultosSeleccion = null;
            listaBultosSeleccion = (ListPersonalizada<Bulto>)grilla.DataSource;

            if (listaBultosSeleccion != null)
            {
                for (int i = 0; i < listaBultosSeleccion.Count; i++)
                {
                    var bultos = listaBultosSeleccion[i];
                    grilla.Rows[i].Cells[0].Value = bultos.codBulto;
                    grilla.Rows[i].Cells[1].Value = bultos.SSCC;
                }
            }
        }

        private void formatearGrillaNuevoEditar(DataGridView grilla)
        {
            ListPersonalizada<LineaSolicitudBulto> listaLineaSolicitudBultos = null;
            listaLineaSolicitudBultos = (ListPersonalizada<LineaSolicitudBulto>)grilla.DataSource;

            if (listaLineaSolicitudBultos != null)
            {
                for (int i = 0; i < listaLineaSolicitudBultos.Count; i++)
                {
                    var lineaSolicitudBulto = listaLineaSolicitudBultos[i];
                    grilla.Rows[i].Cells[0].Value = lineaSolicitudBulto.bulto.codBulto;
                    grilla.Rows[i].Cells[1].Value = lineaSolicitudBulto.bulto.SSCC;

                }
            }
        }

        private void habilitarBotones(Boolean activar)
        {
            if (activar)
            {
                this.btnBuscarTiendaO.Enabled = true;
                this.btnBuscarTiendaD.Enabled = true;
                this.dtpFechaVencimiento.Enabled = true;
                this.txtObservacion.Enabled = true;
                this.btnBuscarProducto.Enabled = true;
                this.btnAgregar.Enabled = true;
                this.btnEliminar.Enabled = true;
            }
            else
            {
                this.btnBuscarTiendaO.Enabled = false;
                this.btnBuscarTiendaD.Enabled = false;
                this.dtpFechaVencimiento.Enabled = false;
                this.txtObservacion.Enabled = false;
                this.btnBuscarProducto.Enabled = false;
                this.btnAgregar.Enabled = false;
                this.btnEliminar.Enabled = false;
            }
        }

        private void cambiarEstadoBotones(Opcion tipoOpcion)
        {
            switch (tipoOpcion)
            {
                case Opcion.Abrir:
                    this.tbtnEditar.Enabled = true;
                    this.tbtnNuevo.Enabled = true;
                    this.tbtnSalir.Enabled = true;
                    this.tbtnAbrir.Enabled = false;
                    this.tbtnCancelar.Enabled = true;
                    this.tbtnGrabar.Enabled = false;
                    break;
                case Opcion.Nuevo:
                    this.tbtnGrabar.Enabled = true;
                    this.tbtnSalir.Enabled = true;
                    this.tbtnCancelar.Enabled = true;
                    this.tbtnNuevo.Enabled = false;
                    this.tbtnAbrir.Enabled = false;
                    this.tbtnEditar.Enabled = false;
                    break;
                case Opcion.Editar:
                    this.tbtnGrabar.Enabled = true;
                    this.tbtnSalir.Enabled = true;
                    this.tbtnCancelar.Enabled = true;
                    this.tbtnEditar.Enabled = false;
                    this.tbtnNuevo.Enabled = false;
                    this.tbtnAbrir.Enabled = false;
                    break;
                case Opcion.Grabar:
                    this.tbtnNuevo.Enabled = true;
                    this.tbtnEditar.Enabled = true;
                    this.tbtnSalir.Enabled = true;
                    this.tbtnCancelar.Enabled = true;
                    this.tbtnGrabar.Enabled = false;
                    this.tbtnAbrir.Enabled = false;
                    break;
                case Opcion.Atendido:
                    this.tbtnNuevo.Enabled = true;
                    this.tbtnSalir.Enabled = true;
                    this.tbtnGrabar.Enabled = false;
                    this.tbtnEditar.Enabled = false;
                    this.tbtnAbrir.Enabled = false;
                    break;
                case Opcion.Cancelar:
                    this.tbtnAbrir.Enabled = true;
                    this.tbtnNuevo.Enabled = true;
                    this.tbtnGrabar.Enabled = false;
                    this.tbtnEditar.Enabled = false;
                    this.tbtnCancelar.Enabled = false;
                    break;
                case Opcion.Generar:
                    this.tbtnAbrir.Enabled = true;
                    this.tbtnNuevo.Enabled = true;
                    this.tbtnSalir.Enabled = true;
                    this.tbtnGrabar.Enabled = false;
                    this.tbtnEditar.Enabled = false;
                    break;
            }
        }

        private Solicitud obtenerSolicitud(Solicitud solicitud)
        {
            Operacion operacion = null;
            string contenidoXML = string.Empty;

            // Estableciendo operacion a ser enviada al Servicio REST
            operacion = new Operacion();
            operacion.numero = Constantes.OPERACION_OBTENER_SOLICITUD;
            operacion.solicitud = solicitud;

            // Instanciando y ejecutando llamada al ServicioREST
            ConexionREST conexionREST = new ConexionREST();
            contenidoXML = conexionREST.ejecutarOperacion(operacion);

            // Obteniendo Objeto de Error
            OperacionError operacionError = contenidoXML.DeserializarTo<OperacionError>();

            // Validar si hay error
            if (operacionError != null)
            {
                Libreria.ShowMessageboxError(operacionError.descripcion);
                return solicitud;
            }

            // Obteniendo Objeto de Producto
            Solicitud solicitudObtenido = contenidoXML.DeserializarTo<Solicitud>();

            return solicitudObtenido;

        }
        private void elegirProducto()
        {

            if (this.tiendaOrigenActual == null)
            {
                Libreria.ShowMessageboxInfo("Elegir tienda de origen y destino", TITULO);
                return;
            }

            using (frmMantProducto frmMantProducto = new frmMantProducto())
            {
                frmMantProducto.formularioBusqueda = true;
                if (frmMantProducto.ShowDialog() == DialogResult.Cancel) { return; }

                this.producto = frmMantProducto.productoActual;

                // Mostrar los datos del producto
                this.txtProductoCodigo.Text = producto.codigo;
                this.txtProductoDescripcion.Text = string.Format(FORMATO_PRODUCTO_DESCRIPCION_DETALLADA, producto.nivelProducto.descripcion,
                                                                                                         producto.nivelTipo.descripcion,
                                                                                                         producto.nivelMaterial.descripcion,
                                                                                                         producto.nivelColor.descripcion);
            }

            obtenerBultos(this.producto);
        }

        private void elegirProductoE()
        {

            if (this.tiendaOrigenActual == null)
            {
                Libreria.ShowMessageboxInfo("Elegir tienda de origen y destino", TITULO);
                return;
            }

            using (frmMantProducto frmMantProducto = new frmMantProducto())
            {
                frmMantProducto.formularioBusqueda = true;
                if (frmMantProducto.ShowDialog() == DialogResult.Cancel) { return; }

                this.producto = frmMantProducto.productoActual;

                // Mostrar los datos del producto
                this.txtProductoCodigo.Text = producto.codigo;
                this.txtProductoDescripcion.Text = string.Format(FORMATO_PRODUCTO_DESCRIPCION_DETALLADA, producto.nivelProducto.descripcion,
                                                                                                         producto.nivelTipo.descripcion,
                                                                                                         producto.nivelMaterial.descripcion,
                                                                                                         producto.nivelColor.descripcion);
            }

            obtenerBultos(this.producto);
        }

        private void obtenerBultos(Producto producto)
        {
            Operacion operacion = null;
            string contenidoXML = string.Empty;

            try
            {
                // Estableciendo operacion a ser enviada al Servicio REST
                operacion = new Operacion();
                operacion.numero = Constantes.OPERACION_LISTAR_BULTOS_PRODUCTO;

                operacion.producto = new Producto();
                operacion.producto.codigo = this.txtProductoCodigo.Text;//producto.codigo;
                
                operacion.bulto = new Bulto();
                operacion.bulto.tienda = new Tienda();
                operacion.bulto.tienda.codigo = this.txtTiendaOCodigo.Text;

                // Instanciando y ejecutando llamada al ServicioREST
                ConexionREST conexionREST = new ConexionREST();
                contenidoXML = conexionREST.ejecutarOperacion(operacion);

                // Obteniendo Objeto de Error
                OperacionError operacionError = contenidoXML.DeserializarTo<OperacionError>();

                // Validar si hay error
                if (operacionError != null)
                {
                    Libreria.ShowMessageboxError(operacionError.descripcion);
                    return;
                }

                // Obteniendo Objeto de ListaItem
                ListaBulto listaBulto = contenidoXML.DeserializarTo<ListaBulto>();

                // Se establece propiedad para evitar que genere nuevas columnas que no estan mapeadas en la grilla
                this.dgvListadoBultos.AutoGenerateColumns = false;

                // Se establece la fuente de datos de la grilla
                this.dgvListadoBultos.DataSource = listaBulto.lista;

                pintarGrillaSolicitudActual(this.dgvListadoBultos);

                // Validar si el producto tiene items disponibles
                if (listaBulto.lista.Count == 0)
                {
                    Libreria.ShowMessageboxExclamacion("El producto seleccionado, no tiene bultos disponibles", TITULO);
                }
            }
            catch (Exception ex)
            {
                log.Error(ex.Message, ex);
                Libreria.MensajeError(ex, TITULO);
            }
        }

        private void pintarGrillaSolicitudActual(DataGridView grilla)
        {
            ListPersonalizada<Bulto> listaBultos = null;
            listaBultos = (ListPersonalizada<Bulto>)grilla.DataSource;

            if (listaBultos != null)
            {
                for (int i = 0; i < listaBultos.Count; i++)
                {
                    var bulto = listaBultos[i];
                    grilla.Rows[i].Cells[0].Value = bulto.codBulto;
                    grilla.Rows[i].Cells[1].Value = bulto.SSCC;
                    switch (bulto.estado)
                    {
                        case Constantes.ESTADO_BULTO_PENDIENTE:
                            {
                                grilla.Rows[i].Cells[2].Value = Constantes.ESTADO_BULTO_DESCRIPCION_PENDIENTE;
                                break;
                            }
                        case Constantes.ESTADO_BULTO_SOLICITADO:
                            {
                                grilla.Rows[i].Cells[2].Value = Constantes.ESTADO_BULTO_DESCRIPCION_SOLICITADO;
                                break;
                            }
                        case Constantes.ESTADO_BULTO_DESPACHADO:
                            {
                                grilla.Rows[i].Cells[2].Value = Constantes.ESTADO_BULTO_DESCRIPCION_DESPACHADO;
                                break;
                            }
                        case Constantes.ESTADO_BULTO_RECIBIDO:
                            {
                                grilla.Rows[i].Cells[2].Value = Constantes.ESTADO_BULTO_DESCRIPCION_RECIBIDO;
                                break;
                            }
                        case Constantes.ESTADO_BULTO_CONTENIDO_DE_BAJA:
                            {
                                grilla.Rows[i].Cells[2].Value = Constantes.ESTADO_BULTO_DESCRIPCION_CONTENIDO_DE_BAJA;
                                break;
                            }
                    }
                }
            }
        }
        private void editar()
        {
            /*if (this.solicitudActual.estado.Equals(Constantes.ESTADO_DOCUMENTO_DESPACHADO)||
                this.solicitudActual.estado.Equals(Constantes.ESTADO_DOCUMENTO_RECEPCIONADO)||
                this.solicitudActual.estado.Equals(Constantes.ESTADO_DOCUMENTO_PARCIAL)||
                this.solicitudActual.estado.Equals(Constantes.ESTADO_DOCUMENTO_AUTORIZADO)||
                this.solicitudActual.estado.Equals(Constantes.ESTADO_DOCUMENTO_IMPRESO)||
                this.solicitudActual.estado.Equals(Constantes.ESTADO_DOCUMENTO_DEVUELTO))
            {
                Libreria.ShowMessageboxInfo("La solicitud ya ha sido atendida, no se pueden realizar cambios", TITULO);
                return;
            }*/

            this.grpDatos.Enabled = true;
            this.cboEstado.Enabled = true;

            // Estableciendo los estados de los botones
            cambiarEstadoBotones(Opcion.Editar);

            this.tipoOperacion = OperacionMantenimiento.Editar;

            // Estableciendo focus control
            this.cboEstado.Focus();

            this.cboEstado.Enabled = true;
            this.btnBuscarTiendaO.Enabled = true;
            this.btnBuscarTiendaD.Enabled = true;
            this.dtpFechaVencimiento.Enabled = true;
            this.txtObservacion.Enabled = true;
            this.btnAgregar.Enabled = true;
            this.btnEliminar.Enabled = true;
            this.btnBuscarProducto.Enabled = true;
            this.tbtnCancelar.Enabled = false;
            this.tbtnSalir.Enabled = false;    
        }
        
        private bool validarItemRepetido(string codBulto)
        {
            bool resultato = false;

            // Obteniendo lista de items seleccionados
            ListPersonalizada<Bulto> listaBultosSeleccion = (ListPersonalizada<Bulto>)this.dgvListadoBultosSeleccionados.DataSource;

            if (listaBultosSeleccion != null)
            {
                foreach (Bulto bulto in listaBultosSeleccion)
                {
                    if (bulto.codBulto.Equals(codBulto))
                    {
                        resultato = true;
                        break;
                    }
                }
            }

            return resultato;
        }

        private bool validarItemRepetidoEditar(string codBulto)
        {
            bool resultato = false;

            // Obteniendo lista de items seleccionados
            ListPersonalizada<LineaSolicitudBulto> listaLineaSolicitudBultos = (ListPersonalizada<LineaSolicitudBulto>)this.dgvListadoBultosSeleccionados.DataSource;

            if (listaLineaSolicitudBultos != null)
            {
                foreach (LineaSolicitudBulto lineabulto in listaLineaSolicitudBultos)
                {
                    if (lineabulto.bulto.codBulto.Equals(codBulto))
                    {
                        resultato = true;
                        break;
                    }
                }
            }

            return resultato;
        }


        private bool validarAgregar()
        {
            this.txtProductoCodigo.Text = this.txtProductoCodigo.Text.Trim();
            this.txtProductoDescripcion.Text = this.txtProductoDescripcion.Text.Trim();

            if (this.txtProductoDescripcion.Text.Equals(string.Empty))
            {
                Libreria.ShowMessageboxExclamacion("Debe seleccionar un producto para agregar", TITULO);
                return true;
            }

            return false;
        }

        private void agregarBulto()
        {
          if (tipoOperacion == OperacionMantenimiento.Nuevo)
          {
            ListPersonalizada<Bulto> listaBultos = null;
            ListPersonalizada<Bulto> listaBultosSeleccion = null;

            try
            {
                // Validar que el producto haya sido elegido
                if (validarAgregar()) { return; }

                // Capturando fuentes de datos de las grillas
                listaBultos = (ListPersonalizada<Bulto>)this.dgvListadoBultos.DataSource;
                listaBultosSeleccion = (ListPersonalizada<Bulto>)this.dgvListadoBultosSeleccionados.DataSource;

                if (listaBultosSeleccion == null) { listaBultosSeleccion = new ListPersonalizada<Bulto>(); }

                // Validar si el producto tiene Bultos disponibles
                if (listaBultos.Count == 0)
                {
                    Libreria.ShowMessageboxExclamacion("El producto actual, no tiene Bultos disponibles", TITULO);
                    return;
                }

                // Bulto Seleccionado
                Bulto bultoSeleccionado = listaBultos[this.dgvListadoBultos.CurrentRow.Index];

                // Valida si el item ya fue agregado
                if (validarItemRepetido(bultoSeleccionado.codBulto))
                {
                    Libreria.CampoNecesario(this.dgvListadoBultos, "Este Bulto ya se encuentra asociado a la solicitud", TITULO);
                    return;
                }
             
               // Instanciando Bulto a agregar
               // LineaSolicitudBulto lineaSolicitudBultoAgregar = new LineaSolicitudBulto();
               // lineaSolicitudBultoAgregar.codigoSolicitud = Convert.ToInt32(this.txtCodigo.Text);
               //lineaSolicitudBultoAgregar.bulto = new Bulto();
               // lineaSolicitudBultoAgregar.bulto.codBulto = bultoSeleccionado.codBulto;

                Bulto bultoAgregar = new Bulto();
                bultoAgregar.codBulto = bultoSeleccionado.codBulto;
                bultoAgregar.SSCC = bultoSeleccionado.SSCC;
                bultoAgregar.estado = Constantes.ESTADO_BULTO_SOLICITADO;
                bultoAgregar.fechaRegistro = bultoSeleccionado.fechaRegistro;

                // Agregando item a listado de items seleccionados
                listaBultosSeleccion.Add(bultoAgregar);

                // Se establece propiedad para evitar que genere nuevas columnas que no estan mapeadas en la grilla
                this.dgvListadoBultosSeleccionados.AutoGenerateColumns = false;

                // Actualizando en grilla
                this.dgvListadoBultosSeleccionados.DataSource = null;
                this.dgvListadoBultosSeleccionados.DataSource = listaBultosSeleccion;

                formatearGrillaNuevo(this.dgvListadoBultosSeleccionados);

                //Mensaje de 2do componente dentro del bulto
                if (producto.componentes.Equals(Constantes.SI))
                {
                    bultoAgregar = obtenerBultoComponente(bultoAgregar);

                    foreach (ItemComponente itemComponente in bultoAgregar.listaItemComponente.lista)
                    {
                        for (int i = 0; i < this.dgvListadoBultos.Rows.Count; i++)
                        {
                            Bulto bultoGrilla = new Bulto();
                            bultoGrilla.codBulto = Convert.ToString(this.dgvListadoBultos.Rows[i].Cells[0].Value);
                            bultoGrilla = obtenerBultoComponenteGrilla(bultoGrilla);

                            foreach(ItemComponente itemComponenteNuevo in bultoGrilla.listaItemComponente.lista)
                            {
                                if (!validarItemRepetido(bultoGrilla.codBulto)) 
                                { 
                                    if (!itemComponente.codComponente.Equals(itemComponenteNuevo.codComponente) && itemComponente.codItem.Equals(itemComponenteNuevo.codItem))
                                        {
                                         if (MessageBox.Show("El componente del bulto añadido se encuentra en otro bulto, ¿Desea agregarlo?", "Atencion", MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.Yes)
                                            {
                                                Bulto bultoAgregarComponente = new Bulto();
                                                bultoAgregarComponente.codBulto = bultoGrilla.codBulto;
                                                bultoAgregarComponente.SSCC = bultoGrilla.SSCC;
                                                bultoAgregarComponente.estado = Constantes.ESTADO_BULTO_SOLICITADO;
                                                bultoAgregarComponente.fechaRegistro = bultoGrilla.fechaRegistro;

                                                // Agregando item a listado de items seleccionados
                                                listaBultosSeleccion.Add(bultoAgregarComponente);

                                                // Se establece propiedad para evitar que genere nuevas columnas que no estan mapeadas en la grilla
                                                this.dgvListadoBultosSeleccionados.AutoGenerateColumns = false;

                                                // Actualizando en grilla
                                                this.dgvListadoBultosSeleccionados.DataSource = null;
                                                this.dgvListadoBultosSeleccionados.DataSource = listaBultosSeleccion;

                                                formatearGrillaNuevo(this.dgvListadoBultosSeleccionados);
                                            }

                                      }
                                }
                               
                            }
                        }
                    }

                }
            }
            
            catch (Exception ex)
            {
                log.Error(ex.Message, ex);
                Libreria.MensajeError(ex, TITULO);
            }
          }
          else if (tipoOperacion == OperacionMantenimiento.Editar)
          {
              ListPersonalizada<Bulto> listaBultos = null;
              ListPersonalizada<LineaSolicitudBulto> listaLineaSolicitudBultos = null;

              try
              {
                  // Validar que el producto haya sido elegido
                  if (validarAgregar()) { return; }

                  // Capturando fuentes de datos de las grillas
                  listaBultos = (ListPersonalizada<Bulto>)this.dgvListadoBultos.DataSource;
                  listaLineaSolicitudBultos = (ListPersonalizada<LineaSolicitudBulto>)this.dgvListadoBultosSeleccionados.DataSource;

                  if (listaLineaSolicitudBultos == null) { listaLineaSolicitudBultos = new ListPersonalizada<LineaSolicitudBulto>(); }

                  // Validar si el producto tiene Bultos disponibles
                  if (listaBultos.Count == 0)
                  {
                      Libreria.ShowMessageboxExclamacion("No hay bultos disponibles", TITULO);
                      return;
                  }

                  // Bulto Seleccionado
                  Bulto bultoSeleccionado = listaBultos[this.dgvListadoBultos.CurrentRow.Index];

                  // Valida si el item ya fue agregado
                  if (validarItemRepetidoEditar(bultoSeleccionado.codBulto))
                  {
                      Libreria.CampoNecesario(this.dgvListadoBultos, "Este Bulto ya se encuentra asociado a la solicitud", TITULO);
                      return;
                  }

                  LineaSolicitudBulto lineaEditar = new LineaSolicitudBulto();
                  lineaEditar.codigoSolicitud = Convert.ToInt32(this.txtCodigo.Text);
                  lineaEditar.bulto = new Bulto { codBulto = bultoSeleccionado.codBulto, SSCC = bultoSeleccionado.SSCC, estado = "S" };

                  // Agregando item a listado de items seleccionados
                  listaLineaSolicitudBultos.Add(lineaEditar);

                  // Se establece propiedad para evitar que genere nuevas columnas que no estan mapeadas en la grilla
                  this.dgvListadoBultosSeleccionados.AutoGenerateColumns = false;

                  // Actualizando en grilla
                  this.dgvListadoBultosSeleccionados.DataSource = null;
                  this.dgvListadoBultosSeleccionados.DataSource = listaLineaSolicitudBultos;

                  formatearGrillaNuevoEditar(this.dgvListadoBultosSeleccionados);

                  //Mensaje de 2do componente dentro del bulto
                  if (producto.componentes.Equals(Constantes.SI))
                  {
                      lineaEditar.bulto = obtenerBultoComponente(lineaEditar.bulto);

                      foreach (ItemComponente itemComponente in lineaEditar.bulto.listaItemComponente.lista)
                      {
                          for (int i = 0; i < this.dgvListadoBultos.Rows.Count; i++)
                          {
                              LineaSolicitudBulto bultoSolicitudGrilla = new LineaSolicitudBulto();
                              bultoSolicitudGrilla.bulto = new Bulto();
                              bultoSolicitudGrilla.bulto.codBulto = Convert.ToString(this.dgvListadoBultos.Rows[i].Cells[0].Value);
                              bultoSolicitudGrilla.bulto = obtenerBultoComponenteGrilla(bultoSolicitudGrilla.bulto);

                              foreach (ItemComponente itemComponenteNuevo in bultoSolicitudGrilla.bulto.listaItemComponente.lista)
                              {
                                  if (!validarItemRepetidoEditar(bultoSolicitudGrilla.bulto.codBulto))
                                  {
                                      if (!itemComponente.codComponente.Equals(itemComponenteNuevo.codComponente) && itemComponente.codItem.Equals(itemComponenteNuevo.codItem))
                                      {
                                          if (MessageBox.Show("El componente del bulto añadido se encuentra en otro bulto, ¿Desea agregarlo?", "Atencion", MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.Yes)
                                          {
                                              LineaSolicitudBulto bultoAgregarComponenteEditar = new LineaSolicitudBulto();
                                              bultoAgregarComponenteEditar.bulto = new Bulto();
                                              bultoAgregarComponenteEditar.bulto.codBulto = bultoSolicitudGrilla.bulto.codBulto;
                                              bultoAgregarComponenteEditar.bulto.SSCC = bultoSolicitudGrilla.bulto.SSCC;
                                              bultoAgregarComponenteEditar.bulto.estado = Constantes.ESTADO_BULTO_SOLICITADO;
                                              bultoAgregarComponenteEditar.bulto.fechaRegistro = bultoSolicitudGrilla.bulto.fechaRegistro;

                                              // Agregando item a listado de items seleccionados
                                              listaLineaSolicitudBultos.Add(bultoAgregarComponenteEditar);

                                              // Se establece propiedad para evitar que genere nuevas columnas que no estan mapeadas en la grilla
                                              this.dgvListadoBultosSeleccionados.AutoGenerateColumns = false;

                                              // Actualizando en grilla
                                              this.dgvListadoBultosSeleccionados.DataSource = null;
                                              this.dgvListadoBultosSeleccionados.DataSource = listaLineaSolicitudBultos;

                                              formatearGrillaNuevoEditar(this.dgvListadoBultosSeleccionados);
                                          }

                                      }
                                  }

                              }
                          }
                      }

                  }
              }

              catch (Exception ex)
              {
                  log.Error(ex.Message, ex);
                  Libreria.MensajeError(ex, TITULO);
              }
          }
     }


     private Bulto obtenerBultoComponente(Bulto bulto)
        {
            Operacion operacion = null;
            string contenidoXML = string.Empty;

            try
            {
                // Estableciendo operacion a ser enviada al Servicio REST
                operacion = new Operacion();
                operacion.numero = Constantes.OPERACION_OBTENER_BULTO_COMPONENTE;

                operacion.bulto = new Bulto();
                operacion.bulto = bulto;

                // Instanciando y ejecutando llamada al ServicioREST
                ConexionREST conexionREST = new ConexionREST();
                contenidoXML = conexionREST.ejecutarOperacion(operacion);

                // Obteniendo Objeto de Error
                OperacionError operacionError = contenidoXML.DeserializarTo<OperacionError>();

                // Validar si hay error
                if (operacionError != null)
                {
                    Libreria.ShowMessageboxError(operacionError.descripcion);
                    return bulto;
                }

                // Obteniendo Objeto de ListaDetalleBulto
                Bulto bultoEncontrado = contenidoXML.DeserializarTo<Bulto>();

                return bultoEncontrado;
            }
            catch (Exception ex)
            {
                log.Error(ex.Message, ex);
                Libreria.MensajeError(ex, TITULO);
                return bulto;
            }
        }

     private Bulto obtenerBultoComponenteGrilla(Bulto bulto)
     {
         Operacion operacion = null;
         string contenidoXML = string.Empty;

         try
         {
             // Estableciendo operacion a ser enviada al Servicio REST
             operacion = new Operacion();
             operacion.numero = Constantes.OPERACION_OBTENER_BULTO_COMPONENTE;

             operacion.bulto = new Bulto();
             operacion.bulto = bulto;

             // Instanciando y ejecutando llamada al ServicioREST
             ConexionREST conexionREST = new ConexionREST();
             contenidoXML = conexionREST.ejecutarOperacion(operacion);

             // Obteniendo Objeto de Error
             OperacionError operacionError = contenidoXML.DeserializarTo<OperacionError>();

             // Validar si hay error
             if (operacionError != null)
             {
                 Libreria.ShowMessageboxError(operacionError.descripcion);
                 return bulto;
             }

             // Obteniendo Objeto de ListaDetalleBulto
             Bulto bultoEncontradoGrilla = contenidoXML.DeserializarTo<Bulto>();

             return bultoEncontradoGrilla;
         }
         catch (Exception ex)
         {
             log.Error(ex.Message, ex);
             Libreria.MensajeError(ex, TITULO);
             return bulto;
         }
     }

        private void quitarBulto()
        {
            if (tipoOperacion == OperacionMantenimiento.Nuevo)
            {
                ListPersonalizada<Bulto> listaBultosSeleccion = null;
                try
                {
                    listaBultosSeleccion = (ListPersonalizada<Bulto>)this.dgvListadoBultosSeleccionados.DataSource;

                    if (listaBultosSeleccion != null && listaBultosSeleccion.Count > 0)
                    {
                        // Bulto Seleccionado
                        Bulto bultoSeleccionado = listaBultosSeleccion[this.dgvListadoBultosSeleccionados.CurrentRow.Index];

                        listaBultosSeleccion.Remove(bultoSeleccionado);

                        // Actualizando en grilla
                        this.dgvListadoBultosSeleccionados.DataSource = null;
                        this.dgvListadoBultosSeleccionados.DataSource = listaBultosSeleccion;
                    }
                }
                catch (Exception ex)
                {
                    log.Error(ex.Message, ex);
                    Libreria.MensajeError(ex, TITULO);
                }
            }
            else if (tipoOperacion == OperacionMantenimiento.Editar)
            {
                ListPersonalizada<LineaSolicitudBulto> listaLineaSolicitudBultos = null;
                try
                {
                    listaLineaSolicitudBultos = (ListPersonalizada<LineaSolicitudBulto>)this.dgvListadoBultosSeleccionados.DataSource;

                    if (listaLineaSolicitudBultos != null && listaLineaSolicitudBultos.Count > 0)
                    {
                        // Bulto Seleccionado
                        LineaSolicitudBulto bultoSeleccionado = listaLineaSolicitudBultos[this.dgvListadoBultosSeleccionados.CurrentRow.Index];

                        listaLineaSolicitudBultos.Remove(bultoSeleccionado);

                        // Bulto Seleccionado
                        actualizarEstadoBultoQuitar(bultoSeleccionado.bulto);

                        obtenerBultos(this.producto);
                        
                        // Actualizando en grilla
                        this.dgvListadoBultosSeleccionados.DataSource = null;
                        this.dgvListadoBultosSeleccionados.DataSource = listaLineaSolicitudBultos;
                        formatearGrilla(this.dgvListadoBultosSeleccionados);
                    }
                }
                catch (Exception ex)
                {
                    log.Error(ex.Message, ex);
                    Libreria.MensajeError(ex, TITULO);
                }
            }
        }
        private Bulto actualizarEstadoBultoQuitar(Bulto bulto)
        {
            Operacion operacion = null;
            string contenidoXML = string.Empty;

            try
            {
                // Estableciendo operacion a ser enviada al Servicio REST
                operacion = new Operacion();
                operacion.numero = Constantes.OPERACION_MODIFICAR_ESTADO_BULTO;

                operacion.bulto = new Bulto();
                operacion.bulto.codBulto = bulto.codBulto;
                operacion.bulto.estado = Constantes.ESTADO_BULTO_PENDIENTE;
                operacion.bulto.tienda = new Tienda();
                operacion.bulto.tienda.codigo = this.txtTiendaOCodigo.Text;

                // Instanciando y ejecutando llamada al ServicioREST
                ConexionREST conexionREST = new ConexionREST();
                contenidoXML = conexionREST.ejecutarOperacion(operacion);

                // Obteniendo Objeto de Error
                OperacionError operacionError = contenidoXML.DeserializarTo<OperacionError>();

                // Validar si hay error
                if (operacionError != null)
                {
                    Libreria.ShowMessageboxError(operacionError.descripcion);
                    return bulto;
                }

                // Obteniendo Objeto de ListaItem
                Bulto bultoEncontrado = contenidoXML.DeserializarTo<Bulto>();

                return bultoEncontrado;
            }
            catch (Exception ex)
            {
                log.Error(ex.Message, ex);
                Libreria.MensajeError(ex, TITULO);
                return bulto;
            }
        }
        private void abrirBultoSeleccion()
        {
           if (tipoOperacion == OperacionMantenimiento.Nuevo)
           {
            ListPersonalizada<Bulto> listaBultosSeleccion = null;

            listaBultosSeleccion = (ListPersonalizada<Bulto>)this.dgvListadoBultosSeleccionados.DataSource;

            if (listaBultosSeleccion == null) { listaBultosSeleccion = new ListPersonalizada<Bulto>(); }

            // Bulto Seleccionado
            Bulto bultoSeleccionado = listaBultosSeleccion[this.dgvListadoBultosSeleccionados.CurrentRow.Index];
            bultoSeleccionado = obtenerBulto(bultoSeleccionado);

            using (frmContenidoBulto frmContenidoBulto = new frmContenidoBulto())
            {
                frmContenidoBulto.bulto = bultoSeleccionado;
                frmContenidoBulto.ShowDialog();
                frmContenidoBulto.Dispose();
            }
          }

           else if (tipoOperacion == OperacionMantenimiento.Editar)
           {
               ListPersonalizada<LineaSolicitudBulto> listaLineaSolicitudBultos = null;
               listaLineaSolicitudBultos = (ListPersonalizada<LineaSolicitudBulto>)this.dgvListadoBultosSeleccionados.DataSource;

               if (listaLineaSolicitudBultos == null) { listaLineaSolicitudBultos = new ListPersonalizada<LineaSolicitudBulto>(); }

               // Bulto Seleccionado
               LineaSolicitudBulto bultoSeleccionado = listaLineaSolicitudBultos[this.dgvListadoBultosSeleccionados.CurrentRow.Index];
               bultoSeleccionado.bulto = obtenerBulto(bultoSeleccionado.bulto);

               using (frmContenidoBulto frmContenidoBulto = new frmContenidoBulto())
               {
                   frmContenidoBulto.bulto = bultoSeleccionado.bulto;
                   frmContenidoBulto.ShowDialog();
                   frmContenidoBulto.Dispose();
               }

           }
        }
        private void abrirBulto()
        {
            ListPersonalizada<Bulto> listaBultos = null;

            listaBultos = (ListPersonalizada<Bulto>)this.dgvListadoBultos.DataSource;

            if (listaBultos == null) { listaBultos = new ListPersonalizada<Bulto>(); }

            // Bulto Seleccionado
            Bulto bultoSeleccionado = listaBultos[this.dgvListadoBultos.CurrentRow.Index];
            bultoSeleccionado = obtenerBulto(bultoSeleccionado);

            using (frmContenidoBulto frmContenidoBulto = new frmContenidoBulto())
            {
                frmContenidoBulto.bulto = bultoSeleccionado;
                frmContenidoBulto.ShowDialog();
                frmContenidoBulto.Dispose();
            }
        }
        private Bulto obtenerBulto(Bulto bulto)
        {
            Operacion operacion = null;
            string contenidoXML = string.Empty;

            try
            {
                // Estableciendo operacion a ser enviada al Servicio REST
                operacion = new Operacion();
                operacion.numero = Constantes.OPERACION_OBTENER_BULTO_CONTENIDO;

                operacion.bulto = new Bulto();
                operacion.bulto = bulto;

                // Instanciando y ejecutando llamada al ServicioREST
                ConexionREST conexionREST = new ConexionREST();
                contenidoXML = conexionREST.ejecutarOperacion(operacion);

                // Obteniendo Objeto de Error
                OperacionError operacionError = contenidoXML.DeserializarTo<OperacionError>();

                // Validar si hay error
                if (operacionError != null)
                {
                    Libreria.ShowMessageboxError(operacionError.descripcion);
                    return bulto;
                }

                // Obteniendo Objeto de ListaItem
                Bulto bultoEncontrado = contenidoXML.DeserializarTo<Bulto>();

                return bultoEncontrado;
            }
            catch (Exception ex)
            {
                log.Error(ex.Message, ex);
                Libreria.MensajeError(ex, TITULO);
                return bulto;
            }
        }
        private void cancelar()
        {
            if ((this.tipoOperacion == OperacionMantenimiento.Editar) ||
                     (!this.grpDatos.Enabled))
            {
                this.btnBuscar.Focus();
            }

            // Estableciendo estado de TagPage de Listado y datos
            this.tabPagListado.Enabled = true; this.tabPagDatos.Enabled = false;

            // Mostrar la primera pagina del TabControl
            this.tabControl.SelectedIndex = 0;

            // Deshabilitando el grupoBox de datos
            this.grpDatos.Enabled = false;

            // Estableciendo los estados de los botones
            cambiarEstadoBotones(Opcion.Cancelar);

            // Estableciendo focus
            this.btnBuscar.Focus();

        }

        private void salir()
        {
            this.Close();
        }

        #endregion

        private void grpDatos_Enter(object sender, EventArgs e)
        {

        }

        private void cboEstado_SelectedIndexChanged(object sender, EventArgs e)
        {

        }

    }
}
